BOOSTSEG equ 0x07c0

;读取磁盘内容
mov dx, 0x0000
mov cx, 0x0002
mov ax, 0x1000
mov es, ax
xor bx, bx
mov al, 1
mov ah, 0x02
int 0x13

;拷贝代码到内存
cli ;关闭中断，因为恐怕后面的设置被中断影响
mov ax, 0x1000 ;把地址放到0x10000H中，因为有一个偏移
mov ds, ax
mov ax, 0x0000
mov es, ax
mov cx, 128 ;移动128个double word
sub si, si
sub di, di
rep movsd

;-------------------------------------------
;进入保护模式
mov ax, BOOSTSEG
mov ds, ax ;设置要访问的数据段
lidt [idt_48] ;加载中断向量表
lgdt [gdt_48] ;加载GDT描述符

; mov eax, cr0
mov eax, cr0
or al, 1 ;将PE位置1
mov cr0, eax

jmp dword 0x0008:0x00000000 ;进入保护模式 do

gdt:
	dw 0, 0, 0, 0 ;第0个描述符，安全起见不使用
	;第一个描述符，8M
	;段限长，表示最大的地址，所以长度为0x07ff + 1 = 0x0800, 下面0x00c0 颗粒度=4K，相乘=8M
	dw 0x07ff
	dw 0x0000
	dw 0x9a00 ;==>1001 1010
	dw 0x00C0 
	
	;第二个描述符
	dw 0x0002
	dw 0x8000
	dw 0x920B
	dw 0x00c0
end_gdt:

idt_48:
	dw 0x0
	dw 0x0
	dw 0x0

gdt_48:
	dw (end_gdt - gdt) - 1
	dw BOOSTSEG * 16 + gdt
	dw 0x0

times 510 - ($ - $$) db 0
db 0x55
db 0xAA
